iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
AI & Data

已 django + channels 來取得即時股價資料的推播系列 第 25

[Day 25] 實戰應用 - 聊天機器人 - 儲存資料(下)

  • 分享至 

  • xImage
  •  

取資料

目的: 進入聊天室後能夠主動發送商品交易資料(當天特殊交易,ex: 處置交易 or 暫停交易)

# chat/consumers.py
import json
from datetime import datetime
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
from chat.models import Product
from fugle_marketdata import RestClient
#

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
        self.room_group_name = f"chat_{self.room_name}"
        client = RestClient(api_key=api_key)
        self.stock = client.stock

        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name, self.channel_name
        )

        self.accept()

        message = f"""
歡迎來到 {self.room_name} 股票即時推播聊天室,
            """
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name, {"type": "chat.message", "message": message}
        )
        
        # 新加入
        obj = Product.objects.filter(symbol=self.room_name).order_by("-date").first()

        message = '--------------------------------'
        message += f"{obj.date}, {self.room_name} {obj.name}"
        if obj.isnormal:
            message += '正常交易'
        else:
            if obj.isattention:
                message += '注意股票'
            elif obj.isdisposition:
                message += '處置股票'
            elif obj.ishalted:
                message += '暫停股票'

        message += '--------------------------------'

        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name, {"type": "chat.message", "message": message}
        )

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name, self.channel_name
        )

    # Receive message from WebSocket
    def receive(self, text_data):
        text_data_json = json.loads(text_data)


    # Receive message from room group
    def chat_message(self, event):
        message = event["message"]

        # Send message to WebSocket
        self.send(text_data=json.dumps({"message": message}))

    def candles_message(self, event):
        message = event["message"]

        # Send message to WebSocket
        msg = f'現在時間為: {message["date"]}, ' + f','.join([f' {i}: {j}' for i,j in message.items() if i != 'date'])
        self.send(text_data=json.dumps({"message": msg}))


目的:進入聊天室的發送訊息
故程式的實作地方在 connect 的地方
然後是在歡迎訊息後顯示股票資訊, 所以會在 "group_send" 之後

obj = Product.objects.filter(symbol=self.room_name).order_by("-date").first()

這段是 django 的取資料語法, 透過 product 這個物件加上篩選條件 symbol=self.room_name, 以及排序BY日期, 這樣就能是最新的一天資料
first() 的意思是取第一筆, 若要取多筆則是 all()

obj.name # 從 obj 的物件中拿取 name 的資訊

最後在填入發送的程式碼

async_to_sync(self.channel_layer.group_send)(
            self.room_group_name, {"type": "chat.message", "message": message}
        )

大功告成
預期進入可以看到 ( 注意股票)
https://ithelp.ithome.com.tw/upload/images/20231001/2016272449bseVlYPw.png
以及
https://ithelp.ithome.com.tw/upload/images/20231001/201627242gCWzQZnHM.png

如何找到特殊股票


上一篇
[Day 24] 實戰應用 - 聊天機器人 - 儲存資料(中)
下一篇
[Day 26] 實戰應用 - 聊天機器人 - 今日收盤行情(上)
系列文
已 django + channels 來取得即時股價資料的推播30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言